package Negocios;


import DTO.DTOGestionarResultado;
import Excepcion.ApellidoUsuarioCaracterException;
import Excepcion.CantidadDePartidosInvalidaException;
import Excepcion.CantidadDePuntosInvalidoException;
import Excepcion.CompetenciaNoPermiteEmpateException;
import Excepcion.DeporteVacioException;
import Excepcion.EmailInvalidoException;
import Excepcion.EmpateEnEliminacionException;
import Excepcion.EmpateSetException;
import Excepcion.EspaciosVaciosException;
import Excepcion.FaltanPartidosAnterioresException;
import Excepcion.ModalidadVacioException;
import Excepcion.NombreCaracterException;
import Excepcion.NombreUsuarioCaracterException;
import Excepcion.PuntajeImposibleException;
import Excepcion.PuntajeNegativoException;
import Excepcion.PuntajeOverflowException;
import Excepcion.ResultadoNoModificableException;
import Excepcion.TamIncorrectoException;
import Excepcion.TamReglamentoInvalidoException;
import Persistencia.Entidad.Competencia;
import Persistencia.Entidad.FormaDePuntuacion;
import Persistencia.Entidad.Partido;



public class ValidacionString {

	private static final int TAMMAXCOMP = 50; //tamaño maximo nombre competencia
	private static final int TAMMINCOMP = 6; //tamaño minimo nombre competencia
	
	private static final int TAMMAXPART = 50; //tamaño maximo nombre participante
	private static final int TAMMINPART = 1; //tamaño minimo nombre participante
 
	
	public static boolean validarNombreCompetencia(String nombre)
			throws NombreCaracterException
	{
		String mensajeCaracterInvalido = "Nombre inválido. Sólo puede contener: A-Z; a-z; 0-9; '.'; '-'" +
				"'_'; ' ' ";
		String mensajeTamMax = "Nombre inválido. Debe tener hasta";
		String mensajeTamMin = "Nombre inválido. Debe tener al menos ";
		
		if (nombre.length() > TAMMAXCOMP) 
			throw new NombreCaracterException(mensajeTamMax,TAMMAXCOMP);
		else if (nombre.length() < TAMMINCOMP)
			throw new NombreCaracterException(mensajeTamMin, TAMMINCOMP);
		else
		{
			for(int i = 0; i < nombre.length(); i++)
			{
				if (!(nombre.charAt(i) >= 'A' && nombre.charAt(i) <= 'Z')
						&& !(nombre.charAt(i) >= 'a' && nombre.charAt(i) <= 'z')
						&& !Character.isDigit(nombre.charAt(i)) && nombre.charAt(i) != '.'
						&& nombre.charAt(i) != '-' && nombre.charAt(i) != '_'
						&& nombre.charAt(i) != ' ') {
					throw new NombreCaracterException(mensajeCaracterInvalido);
				}
			}
		}
		
		return true;
	}
	
	public static boolean validarNombreOApellido(String nombre, int nombreOApellido)
			throws NombreUsuarioCaracterException, ApellidoUsuarioCaracterException, 
			TamIncorrectoException 
			{
		
			//nombreOApellido 0 es nombre; 1 es apellido
		
			if (nombre.length() < 50)
			{
				nombre.toUpperCase();
				for(int i = 0; i < nombre.length(); i++)
				{
					if(!(nombre.charAt(i) > 64 && nombre.charAt(i) < 91) && !(nombre.charAt(i) == 32))
						if(nombreOApellido == 0)
							throw new NombreUsuarioCaracterException();
						else
							throw new ApellidoUsuarioCaracterException();
					}
			}
			else 
				throw new TamIncorrectoException();
			
			return true;
			}
	
	public static boolean validarDeporteVacio(int deporte) throws DeporteVacioException
	{
		if(deporte == -1)
		{
			String mensaje = "Debe seleccionar un deporte";
			throw new DeporteVacioException(mensaje);
		}
		return false;
	}
	
	public static boolean validarModalidadVacio(int modalidad) throws ModalidadVacioException
	{
		if(modalidad == -1)
		{
			String mensaje = "Debe seleccionar una modalidad";
			throw new ModalidadVacioException(mensaje);
		}
		return false;
	}

	public static boolean validarCantidadPartidos(int cantidadPartidos) 
			throws CantidadDePartidosInvalidaException
	{
		if((cantidadPartidos < 1)||(cantidadPartidos > 999))
		{
			throw new CantidadDePartidosInvalidaException();
		}
		return true;
			
	}
	
	public static boolean validarReglamento(String reglamento) throws TamReglamentoInvalidoException {
		if(!reglamento.isEmpty() && (reglamento.length() < 10 || reglamento.length() > 5000)) {
			throw new TamReglamentoInvalidoException();
		}
		return true;
	}

	public static boolean validarPuntuacion(int puntos) throws CantidadDePuntosInvalidoException   

	{
		if((puntos < 0)||(puntos > 9999))
			throw new CantidadDePuntosInvalidoException();
		return true;
			
	}
	
	public static boolean validarNombreParticipante(String nombre)
			throws NombreCaracterException
	{
		String mensajeCaracterInvalido = "Nombre invalido. Solo puede contener: A-Z; a-z; 0-9; '.'; '-'" +
				"'_'; ' ' ";
		String mensajeTamMax = "Nombre invalido. Debe tener hasta";
		String mensajeTamMin = "Nombre invalido. Debe tener al menos ";
		
	if (nombre.length() > TAMMAXPART) 
		throw new NombreCaracterException(mensajeTamMax,TAMMAXPART);
	else if (nombre.length() < TAMMINPART)
		throw new NombreCaracterException(mensajeTamMin, TAMMINPART);
	else
	{
		for(int i = 0; i < nombre.length(); i++)
		{
/*			if(!(nombre.charAt(i) > 64 && nombre.charAt(i) < 91) || !(nombre.charAt(i) == 32)
					|| !(nombre.charAt(i) > 96 && nombre.charAt(i) < 123) || !(nombre.charAt(i) == 45)
					|| !(nombre.charAt(i) == 95))
					*/
			/*if(!(nombre.charAt(i) > 64 && nombre.charAt(i) < 91) || !(nombre.charAt(i) == 32)
			|| !(nombre.charAt(i) > 96 && nombre.charAt(i) < 123) || !(nombre.charAt(i) == 45)
			|| !(nombre.charAt(i) == 95))
			throw new NombreCaracterException(mensajeCaracterInvalido);
	}*/
	if (!(nombre.charAt(i) >= 'A' && nombre.charAt(i) <= 'Z')
			&& !(nombre.charAt(i) >= 'a' && nombre.charAt(i) <= 'z')
			&& !Character.isDigit(nombre.charAt(i)) && nombre.charAt(i) != '.'
			&& nombre.charAt(i) != '-' && nombre.charAt(i) != '_'
			&& nombre.charAt(i) != ' ')

					throw new NombreCaracterException(mensajeCaracterInvalido);
			}
	}
	
	return true;
	}

	public static boolean validarPuntuacionMayorMenor(int puntos1, int puntos2) throws PuntajeImposibleException {
		if(puntos1 < puntos2)
			throw new PuntajeImposibleException();
		return false;
	}

	public static boolean validarPuntuacionMenos1(int puntos) throws CantidadDePuntosInvalidoException 	{
		if((puntos < -1)||(puntos > 9999))
			throw new CantidadDePuntosInvalidoException();
		return true;
			
	}

	public static void validarGestionDeResultado(Partido partido, Boolean modoEliminacion, FormaDePuntuacion fPuntuacion, DTOGestionarResultado entrada, Competencia competencia) throws ResultadoNoModificableException, EmpateEnEliminacionException, FaltanPartidosAnterioresException, CompetenciaNoPermiteEmpateException, PuntajeNegativoException, EspaciosVaciosException, EmpateSetException, PuntajeOverflowException {
		
		if(modoEliminacion){
			if(partido.getSiguientePartidoEnRondaGanadores().existeResultado()){
				//ya existe un partido posterior
				String err01="Ya existe un resultado posterior a este encuentro que involucran a estos participantes.";
				throw new ResultadoNoModificableException(err01);
			}
			if(fPuntuacion.getTipo()=="Puntuacion"&&(entrada.getPuntajeEquipo1()==entrada.getPuntajeEquipo2())){
				//no se permite empate en modo Eliminacion.
				String err02="No se permiten empates en modo Eliminaci\u00F3n.";
				throw new EmpateEnEliminacionException(err02);
			}

		}
		
		if(partido.getParticipante1()== null || partido.getParticipante2() == null){
			//no estan listos los participantes
			String err03="Debe completar los resultados de rondas anteriores.";
			throw new FaltanPartidosAnterioresException(err03);
			
		}
		
		if(fPuntuacion.getTipo()=="Puntuacion"&&(competencia.getPuntosPorEmpate()==-1)){
			if(entrada.getPuntajeEquipo1()==entrada.getPuntajeEquipo2()){
				//la competencia no permite empate.
				String err04="La competencia no permite empates.";
				throw new CompetenciaNoPermiteEmpateException(err04);
			}
			if((entrada.getPuntajeEquipo1()<0)||(entrada.getPuntajeEquipo2()<0)){
				//El puntaje no puede ser negativo
				String err05="El puntaje no puede ser negativo";
				throw new PuntajeNegativoException(err05);
			}
			if((entrada.getPuntajeEquipo1()>10000)||(entrada.getPuntajeEquipo1()>10000))
			{
				//El puntaje excedio los limites
				String err08="El puntaje excedi\u00F3 los l\u00EDmites. Ingrese un numero menor a 10000";
				throw new PuntajeOverflowException(err08);
			}
		}		
		
		if(fPuntuacion.getId()==FormaDePuntuacion.RESULTADO_FINAL){
			if((competencia.getPuntosPorEmpate()==-1)&&(entrada.getResultadoFinal()==0)){
				//la competencia no permite empate.
				String err04="La competencia no permite empates.";
				throw new CompetenciaNoPermiteEmpateException(err04);
			}
		}
		
		if(fPuntuacion.getId()==FormaDePuntuacion.SETS){
			int cantidadDeSets= competencia.getCantidadDeSets();
			if((cantidadDeSets!=entrada.getSetJugador1().size())||(competencia.getCantidadDeSets()!=entrada.getSetJugador2().size())){
				//no se permiten campos vacios
				String err06="Debe rellenar todos los campos.";
				throw new EspaciosVaciosException(err06);
			}
			else
			{
				for(int i=0;i<cantidadDeSets;i++){
					if(entrada.getSetJugador1().get(i)==entrada.getSetJugador2().get(i))
					{
						//no se puede empatar en un set
						String err07="No se permite empatar ning\u00FAn Set.";
						throw new EmpateSetException(err07);
					}
					if(entrada.getSetJugador1().get(i)<0||entrada.getSetJugador2().get(i)<0){
						//El puntaje no puede ser negativo
						String err05="El puntaje no puede ser negativo";
						throw new PuntajeNegativoException(err05);
					}
				}
			}
		}		
	}
	
	public static void validarEmail(String email) throws EmailInvalidoException {
		if (email == null
				|| email.length() < 1
				|| email.length() > 50) {
			throw new EmailInvalidoException();
		}
		else {
			for (int i = 0; i < email.length(); i++) {
				if (!(email.charAt(i) >= 'A' && email.charAt(i) <= 'Z')
					&& !(email.charAt(i) >= 'a' && email.charAt(i) <= 'z')
					&& !Character.isDigit(email.charAt(i)) && email.charAt(i) != '.'
					&& email.charAt(i) != '-' && email.charAt(i) != '_'
					&& email.charAt(i) != '@') {
					throw new EmailInvalidoException();
				}
			}
		}
	}

	public static Boolean validarCadenaEmail(String correo) {
		
		if(correo.length()>=5){
			for(int i=0;i<correo.length();i++)
			{
				if(((correo.charAt(i)>='a')&&(correo.charAt(i)<='z'))||((correo.charAt(i)>='A')&&(correo.charAt(i)<='Z'))){
					for(int j=i;j<correo.length();j++){
						if(correo.charAt(j)=='@'){
							for(int k=j;k<correo.length();k++){
								if(((correo.charAt(k)>='a')&&(correo.charAt(k)<='z'))||((correo.charAt(k)>='A')&&(correo.charAt(k)<='Z'))){
									for(int l=k;l<correo.length();l++){
										if(correo.charAt(l)=='.'){
											for(int m=l;m<correo.length();m++){
												if(((correo.charAt(m)>='a')&&(correo.charAt(m)<='z'))||((correo.charAt(m)>='A')&&(correo.charAt(m)<='Z'))){
													return true;
												}

											}

										}

									}

								}
							}
						}
					}
				}
			}
		}
		return false;
		
	}

}